package com.lzb.compressmaster.utils;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.arthenica.ffmpegkit.FFmpegKit;
import com.arthenica.ffmpegkit.FFmpegSession;
import com.arthenica.ffmpegkit.ReturnCode;
import com.blankj.utilcode.util.FileUtils;
import com.blankj.utilcode.util.PathUtils;

import java.io.File;
import java.util.List;

/**
 * 竖向图片拼接 + 可选文字水印
 * 使用 FFmpeg 实现
 */
public final class ImageVerticalStitcher {

    /**
     * 统一宽度，可按需要改
     */
    private static final int TARGET_WIDTH = 1200;

    public interface StitchCallback {
        /**
         * 成功：返回最终文件路径
         */
        void onSuccess(@NonNull String outputPath);

        /**
         * 失败：返回异常信息
         */
        void onError(@NonNull String err);
    }

    /**
     * 开始拼接
     */
    public static void stitch(@NonNull Context context,
                              @NonNull List<String> imgPaths,
                              @Nullable String text,
                              @NonNull StitchCallback callback) {

        new Thread(() -> {
            try {
                String outPath = doStitch(imgPaths, text);
                new Handler(Looper.getMainLooper()).post(() -> callback.onSuccess(outPath));
            } catch (Exception e) {
                new Handler(Looper.getMainLooper()).post(() -> callback.onError(e.getMessage()));
            }
        }).start();
    }

    /* ===================== 内部实现 ===================== */

    private static String doStitch(List<String> paths, @Nullable String text) throws Exception {
        if (paths.isEmpty()) {
            throw new IllegalArgumentException("图片列表为空");
        }

        // 1. 输出目录
        File dir = new File(PathUtils.getFilesPathExternalFirst() + "/work/img");
        if (!dir.exists()) dir.mkdirs();

        // 2. 输出文件
        String outPath = new File(dir,
                "stitch_" + System.currentTimeMillis() + ".jpg").getAbsolutePath();

        // 3. 构造命令（去掉开头的 ffmpeg）
        StringBuilder cmd = new StringBuilder("-y");
        for (String p : paths) {
            cmd.append(" -i \"").append(p).append("\"");
        }

        // 4. 滤镜链：先统一宽度 → 竖向拼接 → 可选水印
        StringBuilder filter = new StringBuilder(" -filter_complex \"");
        // 4-1 每张图统一宽度
        for (int i = 0; i < paths.size(); i++) {
            filter.append('[').append(i).append(":v]scale=")
                    .append(TARGET_WIDTH).append(":-1[s").append(i).append("];");
        }
        // 4-2 vstack
        for (int i = 0; i < paths.size(); i++) {
            filter.append("[s").append(i).append(']');
        }
        filter.append("vstack=").append(paths.size());

        // 4-3 水印（文字非空才加）
        if (!android.text.TextUtils.isEmpty(text)) {
            // 优先使用系统中文支持字体，回退到Roboto
            String fontPath = "/system/fonts/NotoSansCJK-Regular.ttc";
            if (!new File(fontPath).exists()) {
                fontPath = "/system/fonts/Roboto-Regular.ttf";
            }
            
            filter.append(",drawtext=fontfile='").append(fontPath).append("':")
                    .append("text='").append(text).append("':")
                    .append("fontcolor=white@0.9:fontsize=48:")
                    .append("x=(w-text_w)/2:y=(h-text_h)/2"); // 居中
        }
        filter.append('"');

        cmd.append(filter);

        // 5. 输出文件
        cmd.append(" \"").append(outPath).append('"');

        // 6. 执行
        FFmpegSession session = FFmpegKit.execute(cmd.toString());
        if (!ReturnCode.isSuccess(session.getReturnCode())) {
            throw new Exception(session.getFailStackTrace());
        }
        if (!FileUtils.isFileExists(outPath)) {
            throw new Exception("FFmpeg 执行成功但文件未生成");
        }
        return outPath;
    }

    /* ===================== 禁止实例化 ===================== */
    private ImageVerticalStitcher() {
        throw new UnsupportedOperationException("u can't instantiate me!");
    }
}